//
//      ┏┛ ┻━━━━━┛ ┻┓
//      ┃　　　　　　 ┃
//      ┃　　　━　　　┃
//      ┃　┳┛　  ┗┳　┃
//      ┃　　　　　　 ┃
//      ┃　　　┻　　　┃
//      ┃　　　　　　 ┃
//      ┗━┓　　　┏━━━┛
//        ┃　　　┃   神兽保佑
//        ┃　　　┃   代码无BUG！
//        ┃　　　┗━━━━━━━━━┓
//        ┃　　　　　　　    ┣┓
//        ┃　　　　         ┏┛
//        ┗━┓ ┓ ┏━━━┳ ┓ ┏━┛
//          ┃ ┫ ┫   ┃ ┫ ┫
//          ┗━┻━┛   ┗━┻━┛
//
// Created by john on 2020/2/5. qq 1612163290
//

#include <stdio.h>
#include <inaddr.h>
#include "socketutil.h"

#pragma comment(lib, "ws2_32")


int socket_initialize(){
    WSADATA wsadata;
    WORD sockVersion = MAKEWORD(2,2);
    if(WSAStartup(sockVersion,&wsadata)){
        printf("socket startup error\n");
        return 0;
    }
    return 1;
}

int socket_uninitialize(){
    WSACleanup();
    return 1;
}

int socket_create(){
    SOCKET socket_handle = INVALID_SOCKET;
    socket_handle = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (socket_handle == INVALID_SOCKET) {
        printf("socket error !\n");
        return socket_handle;
    }
    return socket_handle;
}

int socket_listen(int socket_handle,int port){
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;//任意IP
    if(bind(socket_handle,(SOCKADDR *)&sin, sizeof(sin))== SOCKET_ERROR){
        printf("bind error\n");
        return 0;
    }
    if(listen(socket_handle,5)==SOCKET_ERROR)
    {
        printf("listen error\n");
        return 0;
    }
    return 1;
}


int socket_connect(int socket_handle,char * addr,int port){
    struct sockaddr_in sin;
    sin.sin_family=AF_INET;
    sin.sin_port=htons(port);
    sin.sin_addr.S_un.S_addr=inet_addr(addr);//127.0.0.1
    if(connect(socket_handle,(SOCKADDR *)&sin, sizeof(sin))){
        printf("connect error");
        return 0;
    }
    return 1;
}

int socket_close(int socket){
    closesocket(socket);

}

//int socket_accept(int socket_handle){
//    struct sockaddr_in remote_addr;
//    int remote_addr_len = sizeof(remote_addr);
//    SOCKET socket_client_handle = accept(socket_handle,(SOCKADDR *)&remote_addr, &remote_addr_len);
//    if(socket_client_handle ==INVALID_SOCKET)
//    {
//        printf("accept error");
//        return 0;
//    }
//    return socket_client_handle;
//}

int socket_accept(int socket_handle,struct sockaddr_in *remoteddr,int *addrlen)
{
    //struct sockaddr_in remoteddr;
    //int addrlen = sizeof(remoteddr);
    SOCKET socket_client = accept(socket_handle,(SOCKADDR *)remoteddr,addrlen);
    if(socket_client==INVALID_SOCKET)
    {
        printf("accept error !\n");
        return  socket_client;
    }
    return socket_client;
}

int socket_send(int socket_handle,char *send_data,int size){
 int ret = send(socket_handle,send_data,size,0);
 return ret;
}

int socket_recv(int socket_handle,char *recv_data,int size){
    int ret = recv(socket_handle,recv_data, size,0);
    return ret;
}